From 79c26560e22a445fcdbc4db0c8f5ccdb226fba8a Mon Sep 17 00:00:00 2001 From: "mafetter@fleming.research" Date: Thu, 13 Jan 2005 12:56:43 +0000 Subject: [PATCH] bitkeeper revision 1.1159.220.2 (41e6700bFJzLjEYlNh48j_cSTbRy9A) Code duplication cleanup: remove a number of duplicate identical static functions in xc_*_{build,restore}.c, replaced with single (non-static) copy in xc_private.c --- tools/libxc/xc_linux_build.c | 144 ++------------------------------ tools/libxc/xc_linux_restore.c | 27 +----- tools/libxc/xc_plan9_build.c | 58 ++----------- tools/libxc/xc_private.c | 146 +++++++++++++++++++++++++++++++++ tools/libxc/xc_private.h | 13 +++ tools/libxc/xc_vmx_build.c | 141 ++----------------------------- 6 files changed, 179 insertions(+), 350 deletions(-) diff --git a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c index 2540819d5f..0932f5cacf 100644 --- a/tools/libxc/xc_linux_build.c +++ b/tools/libxc/xc_linux_build.c @@ -41,52 +41,6 @@ loadelfsymtab( char *elfbase, int xch, u32 dom, unsigned long *parray, struct domain_setup_info *dsi); -static long get_tot_pages(int xc_handle, u32 domid) -{ - dom0_op_t op; - op.cmd = DOM0_GETDOMAININFO; - op.u.getdomaininfo.domain = (domid_t)domid; - op.u.getdomaininfo.ctxt = NULL; - return (do_dom0_op(xc_handle, &op) < 0) ? - -1 : op.u.getdomaininfo.tot_pages; -} - -static int get_pfn_list(int xc_handle, - u32 domid, - unsigned long *pfn_buf, - unsigned long max_pfns) -{ - dom0_op_t op; - int ret; - op.cmd = DOM0_GETMEMLIST; - op.u.getmemlist.domain = (domid_t)domid; - op.u.getmemlist.max_pfns = max_pfns; - op.u.getmemlist.buffer = pfn_buf; - - if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 ) - return -1; - - ret = do_dom0_op(xc_handle, &op); - - (void)munlock(pfn_buf, max_pfns * sizeof(unsigned long)); - - return (ret < 0) ? -1 : op.u.getmemlist.num_pfns; -} - -static int copy_to_domain_page(int xc_handle, - u32 domid, - unsigned long dst_pfn, - void *src_page) -{ - void *vaddr = xc_map_foreign_range( - xc_handle, domid, PAGE_SIZE, PROT_WRITE, dst_pfn); - if ( vaddr == NULL ) - return -1; - memcpy(vaddr, src_page, PAGE_SIZE); - munmap(vaddr, PAGE_SIZE); - return 0; -} - static int setup_guestos(int xc_handle, u32 dom, char *image, unsigned long image_size, @@ -206,7 +160,7 @@ static int setup_guestos(int xc_handle, goto error_out; } - if ( get_pfn_list(xc_handle, dom, page_array, nr_pages) != nr_pages ) + if ( xc_get_pfn_list(xc_handle, dom, page_array, nr_pages) != nr_pages ) { PERROR("Could not get the page frame list"); goto error_out; @@ -229,7 +183,7 @@ static int setup_guestos(int xc_handle, PERROR("Error reading initrd image, could not"); goto error_out; } - copy_to_domain_page(xc_handle, dom, + xc_copy_to_domain_page(xc_handle, dom, page_array[i>>PAGE_SHIFT], page); } } @@ -364,69 +318,6 @@ static int setup_guestos(int xc_handle, return -1; } -static unsigned long get_filesz(int fd) -{ - u16 sig; - u32 _sz = 0; - unsigned long sz; - - lseek(fd, 0, SEEK_SET); - read(fd, &sig, sizeof(sig)); - sz = lseek(fd, 0, SEEK_END); - if ( sig == 0x8b1f ) /* GZIP signature? */ - { - lseek(fd, -4, SEEK_END); - read(fd, &_sz, 4); - sz = _sz; - } - lseek(fd, 0, SEEK_SET); - - return sz; -} - -static char *read_kernel_image(const char *filename, unsigned long *size) -{ - int kernel_fd = -1; - gzFile kernel_gfd = NULL; - char *image = NULL; - unsigned int bytes; - - if ( (kernel_fd = open(filename, O_RDONLY)) < 0 ) - { - PERROR("Could not open kernel image"); - goto out; - } - - *size = get_filesz(kernel_fd); - - if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL ) - { - PERROR("Could not allocate decompression state for state file"); - goto out; - } - - if ( (image = malloc(*size)) == NULL ) - { - PERROR("Could not allocate memory for kernel image"); - goto out; - } - - if ( (bytes = gzread(kernel_gfd, image, *size)) != *size ) - { - PERROR("Error reading kernel image, could not" - " read the whole image (%d != %ld).", bytes, *size); - free(image); - image = NULL; - } - - out: - if ( kernel_gfd != NULL ) - gzclose(kernel_gfd); - else if ( kernel_fd >= 0 ) - close(kernel_fd); - return image; -} - int xc_linux_build(int xc_handle, u32 domid, const char *image_name, @@ -445,13 +336,13 @@ int xc_linux_build(int xc_handle, unsigned long image_size, initrd_size=0; unsigned long vstartinfo_start, vkern_entry; - if ( (nr_pages = get_tot_pages(xc_handle, domid)) < 0 ) + if ( (nr_pages = xc_get_tot_pages(xc_handle, domid)) < 0 ) { PERROR("Could not find total pages for domain"); goto error_out; } - if ( (image = read_kernel_image(image_name, &image_size)) == NULL ) + if ( (image = xc_read_kernel_image(image_name, &image_size)) == NULL ) goto error_out; if ( (ramdisk_name != NULL) && (strlen(ramdisk_name) != 0) ) @@ -462,7 +353,7 @@ int xc_linux_build(int xc_handle, goto error_out; } - initrd_size = get_filesz(initrd_fd); + initrd_size = xc_get_filesz(initrd_fd); if ( (initrd_gfd = gzdopen(initrd_fd, "rb")) == NULL ) { @@ -747,27 +638,6 @@ loadelfimage( return 0; } -static void -map_memcpy( - unsigned long dst, char *src, unsigned long size, - int xch, u32 dom, unsigned long *parray, unsigned long vstart) -{ - char *va; - unsigned long chunksz, done, pa; - - for ( done = 0; done < size; done += chunksz ) - { - pa = dst + done - vstart; - va = xc_map_foreign_range( - xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]); - chunksz = size - done; - if ( chunksz > (PAGE_SIZE - (pa & (PAGE_SIZE-1))) ) - chunksz = PAGE_SIZE - (pa & (PAGE_SIZE-1)); - memcpy(va + (pa & (PAGE_SIZE-1)), src + done, chunksz); - munmap(va, PAGE_SIZE); - } -} - #define ELFROUND (ELFSIZE / 8) static int @@ -818,7 +688,7 @@ loadelfsymtab( (shdr[h].sh_type == SHT_SYMTAB) ) { if ( parray != NULL ) - map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size, + xc_map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size, xch, dom, parray, dsi->v_start); /* Mangled to be based on ELF header location. */ @@ -850,7 +720,7 @@ loadelfsymtab( sym_ehdr->e_shstrndx = SHN_UNDEF; /* Copy total length, crafted ELF header and section header table */ - map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) + + xc_map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) + ehdr->e_shnum * sizeof(Elf_Shdr), xch, dom, parray, dsi->v_start); } diff --git a/tools/libxc/xc_linux_restore.c b/tools/libxc/xc_linux_restore.c index 55f9717802..d7ed2d6776 100644 --- a/tools/libxc/xc_linux_restore.c +++ b/tools/libxc/xc_linux_restore.c @@ -19,31 +19,6 @@ #define DPRINTF(_f, _a...) ((void)0) #endif -static int get_pfn_list(int xc_handle, - u32 domain_id, - unsigned long *pfn_buf, - unsigned long max_pfns) -{ - dom0_op_t op; - int ret; - op.cmd = DOM0_GETMEMLIST; - op.u.getmemlist.domain = (domid_t)domain_id; - op.u.getmemlist.max_pfns = max_pfns; - op.u.getmemlist.buffer = pfn_buf; - - if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 ) - { - PERROR("Could not lock pfn list buffer"); - return -1; - } - - ret = do_dom0_op(xc_handle, &op); - - (void)munlock(pfn_buf, max_pfns * sizeof(unsigned long)); - - return (ret < 0) ? -1 : op.u.getmemlist.num_pfns; -} - /** Read the vmconfig string from the state input. * It is stored as a 4-byte count 'n' followed by n bytes. * The config data is stored in a new string in 'ioctxt->vmconfig', @@ -220,7 +195,7 @@ int xc_linux_restore(int xc_handle, XcIOContext *ioctxt) } /* Build the pfn-to-mfn table. We choose MFN ordering returned by Xen. */ - if ( get_pfn_list(xc_handle, dom, pfn_to_mfn_table, nr_pfns) != nr_pfns ) + if ( xc_get_pfn_list(xc_handle, dom, pfn_to_mfn_table, nr_pfns) != nr_pfns ) { xcio_error(ioctxt, "Did not read correct number of frame " "numbers for new dom"); diff --git a/tools/libxc/xc_plan9_build.c b/tools/libxc/xc_plan9_build.c index 33c9a54914..819969c57d 100755 --- a/tools/libxc/xc_plan9_build.c +++ b/tools/libxc/xc_plan9_build.c @@ -132,52 +132,6 @@ static int #define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED) #define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER) -static long -get_tot_pages(int xc_handle, u32 domid) -{ - dom0_op_t op; - op.cmd = DOM0_GETDOMAININFO; - op.u.getdomaininfo.domain = (domid_t) domid; - op.u.getdomaininfo.ctxt = NULL; - return (do_dom0_op(xc_handle, &op) < 0) ? - -1 : op.u.getdomaininfo.tot_pages; -} - -static int -get_pfn_list(int xc_handle, - u32 domid, unsigned long *pfn_buf, unsigned long max_pfns) -{ - dom0_op_t op; - int ret; - op.cmd = DOM0_GETMEMLIST; - op.u.getmemlist.domain = (domid_t) domid; - op.u.getmemlist.max_pfns = max_pfns; - op.u.getmemlist.buffer = pfn_buf; - - if (mlock(pfn_buf, max_pfns * sizeof (unsigned long)) != 0) - return -1; - - ret = do_dom0_op(xc_handle, &op); - - (void) munlock(pfn_buf, max_pfns * sizeof (unsigned long)); - -#if 0 -#ifdef DEBUG - DPRINTF(("Ret for get_pfn_list is %d\n", ret)); - if (ret >= 0) { - int i, j; - for (i = 0; i < op.u.getmemlist.num_pfns; i += 16) { - fprintf(stderr, "0x%x: ", i); - for (j = 0; j < 16; j++) - fprintf(stderr, "0x%lx ", pfn_buf[i + j]); - fprintf(stderr, "\n"); - } - } -#endif -#endif - return (ret < 0) ? -1 : op.u.getmemlist.num_pfns; -} - static int setup_guestos(int xc_handle, u32 dom, @@ -216,7 +170,7 @@ setup_guestos(int xc_handle, goto error_out; } - if (get_pfn_list(xc_handle, dom, cpage_array, tot_pages) != tot_pages) { + if (xc_get_pfn_list(xc_handle, dom, cpage_array, tot_pages) != tot_pages) { PERROR("Could not get the page frame list"); goto error_out; } @@ -487,11 +441,11 @@ xc_plan9_build(int xc_handle, full_execution_context_t st_ctxt, *ctxt = &st_ctxt; unsigned long virt_startinfo_addr; - if ((tot_pages = get_tot_pages(xc_handle, domid)) < 0) { + if ((tot_pages = xc_get_tot_pages(xc_handle, domid)) < 0) { PERROR("Could not find total pages for domain"); return 1; } - DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages)); + DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages)); kernel_fd = open(image_name, O_RDONLY); if (kernel_fd < 0) { @@ -505,7 +459,7 @@ xc_plan9_build(int xc_handle, return 1; } - DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages)); + DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages)); if (mlock(&st_ctxt, sizeof (st_ctxt))) { PERROR("Unable to mlock ctxt"); return 1; @@ -519,7 +473,7 @@ xc_plan9_build(int xc_handle, PERROR("Could not get info on domain"); goto error_out; } - DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages)); + DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages)); if (!(op.u.getdomaininfo.flags & DOMFLAGS_PAUSED) || (op.u.getdomaininfo.ctxt->pt_base != 0)) { @@ -527,7 +481,7 @@ xc_plan9_build(int xc_handle, goto error_out; } - DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages)); + DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages)); if (setup_guestos(xc_handle, domid, kernel_gfd, tot_pages, &virt_startinfo_addr, &load_addr, &st_ctxt, cmdline, diff --git a/tools/libxc/xc_private.c b/tools/libxc/xc_private.c index e4316e6994..cbf42cc68f 100644 --- a/tools/libxc/xc_private.c +++ b/tools/libxc/xc_private.c @@ -4,6 +4,7 @@ * Helper functions for the rest of the library. */ +#include #include "xc_private.h" void *xc_map_foreign_batch(int xc_handle, u32 dom, int prot, @@ -201,5 +202,150 @@ unsigned long xc_get_m2p_start_mfn ( int xc_handle ) return mfn; } +int xc_get_pfn_list(int xc_handle, + u32 domid, + unsigned long *pfn_buf, + unsigned long max_pfns) +{ + dom0_op_t op; + int ret; + op.cmd = DOM0_GETMEMLIST; + op.u.getmemlist.domain = (domid_t)domid; + op.u.getmemlist.max_pfns = max_pfns; + op.u.getmemlist.buffer = pfn_buf; + + + if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 ) + { + PERROR("Could not lock pfn list buffer"); + return -1; + } + + ret = do_dom0_op(xc_handle, &op); + + (void)munlock(pfn_buf, max_pfns * sizeof(unsigned long)); + +#if 0 +#ifdef DEBUG + DPRINTF(("Ret for xc_get_pfn_list is %d\n", ret)); + if (ret >= 0) { + int i, j; + for (i = 0; i < op.u.getmemlist.num_pfns; i += 16) { + fprintf(stderr, "0x%x: ", i); + for (j = 0; j < 16; j++) + fprintf(stderr, "0x%lx ", pfn_buf[i + j]); + fprintf(stderr, "\n"); + } + } +#endif +#endif + + return (ret < 0) ? -1 : op.u.getmemlist.num_pfns; +} + +long xc_get_tot_pages(int xc_handle, u32 domid) +{ + dom0_op_t op; + op.cmd = DOM0_GETDOMAININFO; + op.u.getdomaininfo.domain = (domid_t)domid; + op.u.getdomaininfo.ctxt = NULL; + return (do_dom0_op(xc_handle, &op) < 0) ? + -1 : op.u.getdomaininfo.tot_pages; +} + +int xc_copy_to_domain_page(int xc_handle, + u32 domid, + unsigned long dst_pfn, + void *src_page) +{ + void *vaddr = xc_map_foreign_range( + xc_handle, domid, PAGE_SIZE, PROT_WRITE, dst_pfn); + if ( vaddr == NULL ) + return -1; + memcpy(vaddr, src_page, PAGE_SIZE); + munmap(vaddr, PAGE_SIZE); + return 0; +} + +unsigned long xc_get_filesz(int fd) +{ + u16 sig; + u32 _sz = 0; + unsigned long sz; + + lseek(fd, 0, SEEK_SET); + read(fd, &sig, sizeof(sig)); + sz = lseek(fd, 0, SEEK_END); + if ( sig == 0x8b1f ) /* GZIP signature? */ + { + lseek(fd, -4, SEEK_END); + read(fd, &_sz, 4); + sz = _sz; + } + lseek(fd, 0, SEEK_SET); + + return sz; +} +char *xc_read_kernel_image(const char *filename, unsigned long *size) +{ + int kernel_fd = -1; + gzFile kernel_gfd = NULL; + char *image = NULL; + unsigned int bytes; + if ( (kernel_fd = open(filename, O_RDONLY)) < 0 ) + { + PERROR("Could not open kernel image"); + goto out; + } + + *size = xc_get_filesz(kernel_fd); + + if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL ) + { + PERROR("Could not allocate decompression state for state file"); + goto out; + } + + if ( (image = malloc(*size)) == NULL ) + { + PERROR("Could not allocate memory for kernel image"); + goto out; + } + + if ( (bytes = gzread(kernel_gfd, image, *size)) != *size ) + { + PERROR("Error reading kernel image, could not" + " read the whole image (%d != %ld).", bytes, *size); + free(image); + image = NULL; + } + + out: + if ( kernel_gfd != NULL ) + gzclose(kernel_gfd); + else if ( kernel_fd >= 0 ) + close(kernel_fd); + return image; +} + +void xc_map_memcpy(unsigned long dst, char *src, unsigned long size, + int xch, u32 dom, unsigned long *parray, + unsigned long vstart) +{ + char *va; + unsigned long chunksz, done, pa; + + for ( done = 0; done < size; done += chunksz ) + { + pa = dst + done - vstart; + va = xc_map_foreign_range( + xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]); + chunksz = size - done; + if ( chunksz > (PAGE_SIZE - (pa & (PAGE_SIZE-1))) ) + chunksz = PAGE_SIZE - (pa & (PAGE_SIZE-1)); + memcpy(va + (pa & (PAGE_SIZE-1)), src + done, chunksz); + munmap(va, PAGE_SIZE); + } +} diff --git a/tools/libxc/xc_private.h b/tools/libxc/xc_private.h index c05ae491d9..0aed21274e 100644 --- a/tools/libxc/xc_private.h +++ b/tools/libxc/xc_private.h @@ -189,4 +189,17 @@ typedef struct mfn_mapper { unsigned long xc_get_m2p_start_mfn ( int xc_handle ); +long xc_get_tot_pages(int xc_handle, u32 domid); + +int xc_copy_to_domain_page(int xc_handle, u32 domid, + unsigned long dst_pfn, void *src_page); + +unsigned long xc_get_filesz(int fd); + +char *xc_read_kernel_image(const char *filename, unsigned long *size); + +void xc_map_memcpy(unsigned long dst, char *src, unsigned long size, + int xch, u32 dom, unsigned long *parray, + unsigned long vstart); + #endif /* __XC_PRIVATE_H__ */ diff --git a/tools/libxc/xc_vmx_build.c b/tools/libxc/xc_vmx_build.c index 13541701b0..58f31cd797 100644 --- a/tools/libxc/xc_vmx_build.c +++ b/tools/libxc/xc_vmx_build.c @@ -46,53 +46,6 @@ loadelfsymtab( char *elfbase, int xch, u32 dom, unsigned long *parray, struct domain_setup_info *dsi); -static long get_tot_pages(int xc_handle, u32 domid) -{ - dom0_op_t op; - op.cmd = DOM0_GETDOMAININFO; - op.u.getdomaininfo.domain = (domid_t)domid; - op.u.getdomaininfo.ctxt = NULL; - return (do_dom0_op(xc_handle, &op) < 0) ? - -1 : op.u.getdomaininfo.tot_pages; -} - -int xc_get_pfn_list(int xc_handle, - u32 domid, - unsigned long *pfn_buf, - unsigned long max_pfns) -{ - dom0_op_t op; - int ret; - op.cmd = DOM0_GETMEMLIST; - op.u.getmemlist.domain = (domid_t)domid; - op.u.getmemlist.max_pfns = max_pfns; - op.u.getmemlist.buffer = pfn_buf; - - - if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 ) - return -1; - - ret = do_dom0_op(xc_handle, &op); - - (void)munlock(pfn_buf, max_pfns * sizeof(unsigned long)); - - return (ret < 0) ? -1 : op.u.getmemlist.num_pfns; -} - -static int copy_to_domain_page(int xc_handle, - u32 domid, - unsigned long dst_pfn, - void *src_page) -{ - void *vaddr = xc_map_foreign_range( - xc_handle, domid, PAGE_SIZE, PROT_WRITE, dst_pfn); - if ( vaddr == NULL ) - return -1; - memcpy(vaddr, src_page, PAGE_SIZE); - munmap(vaddr, PAGE_SIZE); - return 0; -} - static int setup_guestos(int xc_handle, u32 dom, char *image, unsigned long image_size, @@ -225,7 +178,7 @@ static int setup_guestos(int xc_handle, PERROR("Error reading initrd image, could not"); goto error_out; } - copy_to_domain_page(xc_handle, dom, + xc_copy_to_domain_page(xc_handle, dom, page_array[i>>PAGE_SHIFT], page); } } @@ -402,68 +355,6 @@ static int setup_guestos(int xc_handle, return -1; } -static unsigned long get_filesz(int fd) -{ - u16 sig; - u32 _sz = 0; - unsigned long sz; - - lseek(fd, 0, SEEK_SET); - read(fd, &sig, sizeof(sig)); - sz = lseek(fd, 0, SEEK_END); - if ( sig == 0x8b1f ) /* GZIP signature? */ - { - lseek(fd, -4, SEEK_END); - read(fd, &_sz, 4); - sz = _sz; - } - lseek(fd, 0, SEEK_SET); - - return sz; -} - -static char *read_kernel_image(const char *filename, unsigned long *size) -{ - int kernel_fd = -1; - gzFile kernel_gfd = NULL; - char *image = NULL; - unsigned int bytes; - - if ( (kernel_fd = open(filename, O_RDONLY)) < 0 ) - { - PERROR("Could not open kernel image"); - goto out; - } - - *size = get_filesz(kernel_fd); - - if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL ) - { - PERROR("Could not allocate decompression state for state file"); - goto out; - } - - if ( (image = malloc(*size)) == NULL ) - { - PERROR("Could not allocate memory for kernel image"); - goto out; - } - - if ( (bytes = gzread(kernel_gfd, image, *size)) != *size ) - { - PERROR("Error reading kernel image, could not" - " read the whole image (%d != %ld).", bytes, *size); - free(image); - image = NULL; - } - - out: - if ( kernel_gfd != NULL ) - gzclose(kernel_gfd); - else if ( kernel_fd >= 0 ) - close(kernel_fd); - return image; -} #define VMX_FEATURE_FLAG 0x20 @@ -505,13 +396,13 @@ int xc_vmx_build(int xc_handle, goto error_out; } - if ( (nr_pages = get_tot_pages(xc_handle, domid)) < 0 ) + if ( (nr_pages = xc_get_tot_pages(xc_handle, domid)) < 0 ) { PERROR("Could not find total pages for domain"); goto error_out; } - if ( (image = read_kernel_image(image_name, &image_size)) == NULL ) + if ( (image = xc_read_kernel_image(image_name, &image_size)) == NULL ) goto error_out; if ( (ramdisk_name != NULL) && (strlen(ramdisk_name) != 0) ) @@ -522,7 +413,7 @@ int xc_vmx_build(int xc_handle, goto error_out; } - initrd_size = get_filesz(initrd_fd); + initrd_size = xc_get_filesz(initrd_fd); if ( (initrd_gfd = gzdopen(initrd_fd, "rb")) == NULL ) { @@ -746,26 +637,6 @@ loadelfimage( return 0; } -static void -map_memcpy( - unsigned long dst, char *src, unsigned long size, - int xch, u32 dom, unsigned long *parray, unsigned long vstart) -{ - char *va; - unsigned long chunksz, done, pa; - - for ( done = 0; done < size; done += chunksz ) - { - pa = dst + done - vstart; - va = xc_map_foreign_range( - xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]); - chunksz = size - done; - if ( chunksz > (PAGE_SIZE - (pa & (PAGE_SIZE-1))) ) - chunksz = PAGE_SIZE - (pa & (PAGE_SIZE-1)); - memcpy(va + (pa & (PAGE_SIZE-1)), src + done, chunksz); - munmap(va, PAGE_SIZE); - } -} #define ELFROUND (ELFSIZE / 8) @@ -817,7 +688,7 @@ loadelfsymtab( (shdr[h].sh_type == SHT_SYMTAB) ) { if ( parray != NULL ) - map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size, + xc_map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size, xch, dom, parray, dsi->v_start); /* Mangled to be based on ELF header location. */ @@ -849,7 +720,7 @@ loadelfsymtab( sym_ehdr->e_shstrndx = SHN_UNDEF; /* Copy total length, crafted ELF header and section header table */ - map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) + + xc_map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) + ehdr->e_shnum * sizeof(Elf_Shdr), xch, dom, parray, dsi->v_start); } -- 2.30.2